package br.com.actionsystem.gdp.telas;

import br.com.actionsystem.gdp.util.RowCellRender;
import br.com.actionsystem.gdp.dao.PagamentoDaoImpl;
import br.com.actionsystem.gdp.modelo.Despesa;
import br.com.actionsystem.gdp.modelo.Historico;
import br.com.actionsystem.gdp.modelo.Receita;
import br.com.actionsystem.gdp.util.ButtonListener;
import br.com.actionsystem.gdp.util.DaoException;
import java.awt.Dimension;
import java.awt.GridBagLayout;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import br.com.actionsystem.gdp.util.LayoutHelp;
import com.michaelbaranov.microba.calendar.DatePicker;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;

public class Pagamentos extends AbstratcTelas {

    private DatePicker dtInicio;
    private DatePicker dtFim;
    private JScrollPane receitaScroll = new JScrollPane();
    private JScrollPane despesaScroll = new JScrollPane();
    private JTable receitasJTb = null;
    private JTable despesasJTb = null;
    private JButton pesquisarBt = null;
    private List<Historico> historicoDespesas = new ArrayList<Historico>();
    private List<Historico> historicoReceitas = new ArrayList<Historico>();
    private PagamentoDaoImpl pagamentoDao = new PagamentoDaoImpl();
    private String[] colunas = {"Descrição", "Vencimento", "Parcela", "Valor", "Ações"};
    private ConfirmaPagamentoJIntFr confirmaPagamentoJfr;
    List<Historico> listaHistoricoGeral = null;

    public Pagamentos() {

        super("Pagamentos");

        //pesquisa 5 dias pos data atual
        Calendar c = Calendar.getInstance();
        Date d = new Date(c.getTimeInMillis());
        c.add(Calendar.DAY_OF_YEAR, 20);
        
        iniciar();
        atualizaTabela(pagamentoDao.getHistMaiorData(), c.getTime());
        setSize(700, 560);
        setDefaultCloseOperation(Pagamentos.HIDE_ON_CLOSE);

        this.setLocation(50, 0);
    }

    private void iniciar() {
        JPanel geral = new JPanel();
        geral.setLayout(new GridBagLayout());
        geral.setBorder(javax.swing.BorderFactory.createEtchedBorder());
        getCabecalhoPn().add(new JLabel("Data Início:"), LayoutHelp.addLabel());
        getCabecalhoPn().add(getDtInicio(), LayoutHelp.addComponent1());
        getCabecalhoPn().add(new JLabel(""), LayoutHelp.addLabel());
        getCabecalhoPn().add(new JLabel("Data Fim:"), LayoutHelp.addLabel());
        getCabecalhoPn().add(getDtFim(), LayoutHelp.addComponent1());
        getCabecalhoPn().add(new JLabel(""), LayoutHelp.addLabel());
        getCabecalhoPn().add(getPesquisarBt(), LayoutHelp.addComponentFinal());

        Dimension dim = new Dimension(130, 27);
        for (int i = 0; i < getCabecalhoPn().getComponentCount(); i++) {
            JComponent component = (JComponent) getCabecalhoPn().getComponent(i);
            if (!(component instanceof JLabel)) {
                getCabecalhoPn().getComponent(i).setMinimumSize(dim);
                getCabecalhoPn().getComponent(i).setPreferredSize(dim);
            }
            component.setFont(fontBond);
        }
        geral.add(getCabecalhoPn(), LayoutHelp.addComponentFinal());
        despesaScroll.setViewportView(getDespesasTb());
        despesaScroll.setMinimumSize(new Dimension(600, 200));
        despesaScroll.setPreferredSize(new Dimension(600, 200));
        JPanel desPn = new JPanel();
        desPn.setBorder(BorderFactory.createTitledBorder("Despesas"));
        desPn.add(despesaScroll);
        geral.add(desPn, LayoutHelp.addComponentFinal());

        receitaScroll.setViewportView(getReceitasTb());
        receitaScroll.setMinimumSize(new Dimension(600, 200));
        receitaScroll.setPreferredSize(new Dimension(600, 200));
        JPanel recPn = new JPanel();
        recPn.setBorder(BorderFactory.createTitledBorder("Receitas"));
        recPn.add(receitaScroll);
        geral.add(recPn, LayoutHelp.addComponentFinal());
        getContentPane().add(geral);

    }

    public void preencheListas(Date inicio, Date fim) {
        try {
            listaHistoricoGeral = pagamentoDao.getHistoricos(inicio, fim);
            for (Historico h : listaHistoricoGeral) {
                if (h.getAtividadeFK() instanceof Despesa && !h.isIsPago()) {
                    historicoDespesas.add(h);
                } else if (h.getAtividadeFK() instanceof Receita && !h.isIsPago()) {
                    historicoReceitas.add(h);
                }
            }
        } catch (DaoException ex) {
            ex.getMessage();
        }

    }

    private DatePicker getDtInicio() {
        if (dtInicio == null) {
            dtInicio = new DatePicker();
        }
        return dtInicio;
    }

    private DatePicker getDtFim() {
        if (dtFim == null) {
            dtFim = new DatePicker();
        }
        return dtFim;
    }

    private JTable getReceitasTb() {

        receitasJTb = new JTable();
        receitasJTb.setModel(criaModel(historicoReceitas));
        organizaJtable(receitasJTb, historicoReceitas);

        return receitasJTb;
    }

    private JTable getDespesasTb() {

        despesasJTb = new JTable();
        despesasJTb.setModel(criaModel(historicoDespesas));
        organizaJtable(despesasJTb, historicoDespesas);

        return despesasJTb;
    }

    public void organizaJtable(JTable j, List<Historico> listHistorico) {
        j.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        j.setAutoscrolls(true);
        //despesasJTb.setRowSelectionInterval(0, 0);
        j.getColumnModel().getColumn(0).setPreferredWidth(180);
        j.getColumnModel().getColumn(1).setPreferredWidth(58);
        j.getColumnModel().getColumn(2).setPreferredWidth(38);
        j.getColumnModel().getColumn(3).setPreferredWidth(38);
        new ButtonColumn(j, 4, new ButtonListener(this, listHistorico));
    }

    private JButton getPesquisarBt() {
        if (pesquisarBt == null) {
            pesquisarBt = new JButton("Pesquisar");
            pesquisarBt.setToolTipText("Efetuar pesquisa");
            pesquisarBt.addActionListener(new ActionListener() {

                public void actionPerformed(ActionEvent e) {
                    atualizaTabela(dtInicio.getDate(), dtFim.getDate());
                }
            });
        }
        return pesquisarBt;
    }

    public void atualizaTabela() {
        atualizaTabela(dtInicio.getDate(), dtFim.getDate());
    }

    public void atualizaTabela(Date inicio, Date fim) {
        //limpa listas, cria um model e organiza o Jtable
        historicoDespesas.clear();
        historicoReceitas.clear();
        preencheListas(inicio, fim);
        despesasJTb.setModel(criaModel(historicoDespesas));
        receitasJTb.setModel(criaModel(historicoReceitas));
        organizaJtable(receitasJTb, historicoReceitas);
        organizaJtable(despesasJTb, historicoDespesas);
        receitasJTb.repaint();
        despesasJTb.repaint();

        //Atualiza as listas
        preencheListas(dtInicio.getDate(), dtFim.getDate());

        //seleciona as linhas que estao com data de pagamento vencida
        Date hoje = new Date();
        int in = -1;
        for (int i = 0; i < receitasJTb.getRowCount(); i++) {
            if (historicoReceitas.get(i).getDataPagamento().before(hoje)) {
                in = i;
            }
        }
        new RowCellRender(receitasJTb, in);

        for (int i = 0; i < despesasJTb.getRowCount(); i++) {
            if (historicoDespesas.get(i).getDataPagamento().before(hoje)) {
                in = i;
            }
        }
        new RowCellRender(despesasJTb, in);
    }

    private TableModel criaModel(List<Historico> h) {
        SimpleDateFormat dataFormat = new SimpleDateFormat("dd/MM/yyy");
        Object[][] obs = new Object[h.size()][];
        for (int i = 0; i < h.size(); i++) {
            Object[] ob = new Object[5];
            Historico hs = h.get(i);
            ob[0] = hs.getAtividadeFK().getDescricao();
            ob[1] = dataFormat.format(hs.getDataPagamento());
            ob[2] = hs.getNumeroParcela();
            ob[3] = hs.getValor();
            ob[4] = "Acão";
            obs[i] = ob;
        }
        return new DefaultTableModel(obs, colunas);
    }

    public ConfirmaPagamentoJIntFr getConfirmaPagamentoJfr() {
        return confirmaPagamentoJfr;
    }

    public void setConfirmaPagamentoJfr(ConfirmaPagamentoJIntFr confirmaPagamentoJfr) {
        this.confirmaPagamentoJfr = confirmaPagamentoJfr;
    }
}
